<?php
class AutenticacaoBasica {

	protected $id_usuario;
	protected $autenticou;
	protected $connection;
	protected $usuario;
	protected $erros;

	const ERRO_LOGIN_SENHA = "O sistema não pode te autenticar. Favor informar login e senha corretos.";
	const ERRO_USUARIO_NAO_CADASTRADO = "Usuário não possui permissão de acesso ao sistema.";
	const ERRO_SENHA_EXPIRADA = "A sua senha expirou.";

	/*
	 * Este método já constrói o objeto e tenta realizar o login.
	 */
	function __construct($login, $password)
	{
		$this->erros = array();
		$this->autenticou = false;

		if($this->lerLoginSenha($login,$password))
		{
			$usuario = $this->getUsuario();
			$this->autenticou = true;
		}
		else
		{
			if($this->existeLogin($login))
			{
				$this->addErro(self::ERRO_LOGIN_SENHA);
			}
			else
			{
				$this->addErro(self::ERRO_USUARIO_NAO_CADASTRADO);
			}
		}

	}

	function lerLoginSenha($login,$password)
	{
		$ar = Doctrine_Query::create()->from('Usuario u')
		            ->where("u.ds_login = ?", $login)
		            ->addWhere("u.ds_senha = ?", md5($password))
		            ->fetchOne();

		if ($ar !== false)
		{
			$this->id_usuario = $ar['id_usuario'];
			return true;
		}
		else
		{
			$this->id_usuario = null;
			return false;
		}
	}

	function getUsuario()
	{
		if(!$this->usuario)
		{
			$id_usuario = $this->id_usuario;
			$this->usuario = Doctrine::getTable('Usuario')->find($id_usuario);
		}
		return $this->usuario;
	}

	function addErro($erro)
	{
		$this->erros[] = $erro;
	}

	function getErro()
	{
		return implode(';',$this->erros);
	}

	function existeLogin($login)
	{
		$connection = Doctrine::getConnectionByTableName('Usuario');
		$dbh = $connection->getDbh();
		$sth = $dbh->prepare("SELECT count(*) as existe
		                        FROM usuario
		                       WHERE ds_login = '{$login}'");
		$sth->execute();
		$ar = $sth->fetch();
		return $ar['existe'] > 0;
	}

	function autenticou()
	{
		return $this->autenticou;
	}
}